package cn.tedu.apiday06;

import java.util.HashSet;

//测试set集合给自定义学生对象去重
//要求：需要同时提供重写的hashCode()和equals()
//重写hashCode()----因为需要按照对象的属性值来计算hash值，而不是new一个算一个
//重写equals()------因为需要比较两个对象间的属性值，而不是比较地址值，如果属性都一样，则返回true
public class HashSetAction1 {
    public static void main(String[] args) {
        //创建对象
        HashSet <Stedu> h = new HashSet();
        //把Stude对象存入h中
        Stedu s =new Stedu("孙",19);
        Stedu s1 =new Stedu("符",23);
        Stedu s2 =new Stedu("刘",24);
        Stedu s3 =new Stedu("何",24);
        Stedu s4 =new Stedu("何",24);
        h.add(s);
        h.add(s1);
        h.add(s2);
        h.add(s3);
        System.out.println(s4.hashCode()+"=========="+s3.hashCode());
        System.out.println(s4.equals(s3)+"======");

        //set号称可以去重复，但是s4何s3是一样，那真的去重了吗，但是结果s4并没有被去重，这是为什么呢
        //想要给自定义对象去重，必须满足以下的判断条件
//        if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k))))
        //目前s4和s5有不同的hash值，怎么让s4   s5的hash值相同呢？其实是底层根据hashCode()分配的hash值
        //也就是说，只要new一次，就会分配一个唯一的hash值！！
        //想要根据对象的属性值计算得到hash值，如果属性值都一样，能够计算出来相同的hash值---重写hashCode()!!!
        //重写了hashCode()，使得两个属性相同的序拥有了相同的hash值！！
        //key.equals（k）-------让两对象间的equals（）返回true -- ---- 默认是==比较两个对象的地址值  这时候需要按照属性值比较  也就是重写equals（）
        System.out.println(h);
    }
}
